home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-01-12 | 11.0 KB | 344 lines | [TEXT/CWIE] |
- ///--------------------------------------------------------------------------------------
- // SpriteWorld.h
- //
- // Portions are copyright: © 1991-94 Tony Myles, All rights reserved worldwide.
- //
- // Description: constants, structures, and prototypes for sprite worlds
- ///--------------------------------------------------------------------------------------
-
-
- #ifndef __SPRITEWORLD__
- #define __SPRITEWORLD__
-
- #ifndef __SWCOMMON__
- #include "SWCommonHeaders.h"
- #endif
-
- #ifndef __SPRITELAYER__
- #include "SpriteLayer.h"
- #endif
-
- #ifndef __SPRITEFRAME__
- #include "SpriteFrame.h"
- #endif
-
- #ifndef __SPRITE__
- #include "Sprite.h"
- #endif
-
- #ifndef __TILING__
- #include "Tiling.h"
- #endif
-
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #if PRAGMA_ALIGN_SUPPORTED
- #pragma options align=mac68k
- #endif
-
- ///--------------------------------------------------------------------------------------
- // sprite world error constants
- ///--------------------------------------------------------------------------------------
-
- enum
- {
- kSystemTooOldErr = 100, // < System 7.0
- kMaxFramesErr, // attempt to exceed maximum number of frames for a sprite
- kInvalidFramesIndexErr, // frame index out of range
- kNotCWindowErr, // attempt to make a SpriteWorld from non-color WindowPtr
- kNilParameterErr, // nil SpritePtr, FramePtr, etc.
- kWrongDepthErr, // 105 // invalid pixel size for attempted function
- kWrongMaskErr, // invalid mask type for attempted function
- kOutOfRangeErr, // tileID, tileMap, or other value out of bounds
- kTilingNotInitialized, // tiling hasn't been initialized
- kTilingAlreadyInitialized, // tiling already initialized; can't be initialized again
- kNullTileMapErr, // 110 // no TileMap has ever been created/loaded
- kTileMapNotLockedErr, // the TileMap is not locked and can't be used until it is
- kAlreadyCalledErr, // the function was already called and can't be called again
- kSpriteNotCompiledErr, // the sprite must be compiled before drawProc can be set
- kBadParameterErr, // 114 // a parameter that was passed to the function is invalid
- kSpriteAlreadyInLayer, // the Sprite is already in a Layer, and can't be added to another
- kNilFrameErr, // the Frame this function acts on is NIL
- kNotLockedErr // a structure that must be locked is not
- };
-
-
- ///--------------------------------------------------------------------------------------
- // UpdateRectStruct data structure
- ///--------------------------------------------------------------------------------------
- typedef struct UpdateRectStruct UpdateRectStruct;
- typedef UpdateRectStruct *UpdateRectStructPtr;
-
- struct UpdateRectStruct
- {
- Rect updateRect; // this rect
- UpdateRectStructPtr nextRectStructP; // next rect struct
- };
-
-
- ///--------------------------------------------------------------------------------------
- // sprite world type definitions
- ///--------------------------------------------------------------------------------------
-
- typedef SW_FUNC void (*WorldMoveProcPtr)(
- SpriteWorldPtr spriteWorldP,
- SpritePtr followSpriteP);
-
- typedef SW_FUNC void (*CallBackPtr)(
- SpriteWorldPtr spriteWorldP);
-
- typedef SW_FUNC void (*DoubleDrawProcPtr)(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect *srcRectA,
- Rect *dstRectA,
- Rect *srcRectB,
- Rect *dstRectB);
-
-
- ///--------------------------------------------------------------------------------------
- // sprite world data structure
- ///--------------------------------------------------------------------------------------
-
- struct SpriteWorldRec
- {
- SpriteLayerPtr headSpriteLayerP; // head of the sprite layer linked list
- SpriteLayerPtr tailSpriteLayerP; // tail of the sprite layer linked list
- SpriteLayerPtr deadSpriteLayerP; // where SWRemoveSpriteFromAnimation puts Sprites
-
- UpdateRectStructPtr headUpdateRectP; // used by SWFlagRectAsChanged
-
- FramePtr extraBackFrameP; // used when adding a background behind tiles
- FramePtr backFrameP; // frame for the background
- FramePtr workFrameP; // work, or "mixing" frame
- FramePtr windowFrameP; // frame for drawing to the screen
-
- DrawProcPtr offscreenDrawProc; // callback for erasing sprites offscreen
- DrawProcPtr screenDrawProc; // callback for drawing sprite pieces onscreen
- DoubleDrawProcPtr doubleRectDrawProc; // callback for updating screen when scrolling
-
- CallBackPtr postEraseCallBack; // called after erasing sprites
- CallBackPtr postDrawCallBack; // called after drawing sprites
-
- Rect windRect; // holds windowFrameP->frameRect for easier access
- Rect backRect; // holds backFrameP->frameRect for easier access
- Rect originalWindRect; // used by SWChangeWorldRect and SWRestoreWindRect
- Rect originalBackRect; // used by SWChangeWorldRect and SWRestoreWindRect
-
- Rect visScrollRect; // rect that is copied to screen when scrolling
- Rect oldVisScrollRect; // visScrollRect from last frame
- Rect offscreenScrollRect; // same as visScrollRect, but local to offscreen
- short horizScrollRectOffset; // offset from offscreenScrollRect to visScrollRect
- short vertScrollRectOffset; // offset from offscreenScrollRect to visScrollRect
- short horizScrollDelta; // horizontal scrolling delta
- short vertScrollDelta; // vertical scrolling delta
- Rect scrollRectMoveBounds; // move bounds for visScrollRect
-
- WorldMoveProcPtr worldMoveProc; // pointer to the scrolling world move procedure
- SpritePtr followSpriteP; // pointer to the "follow sprite", or NULL
-
- TileMapStructPtr *tileLayerArray; // an array of all the tileMap layers
- short lastActiveTileLayer; // the last active tile layer
- Boolean tilingIsInitialized; // has the tiling been initialized yet?
- Boolean tilingIsOn; // are the tiling routines turned on?
- short **tilingCache; // two-dimensional tiling cache
- short numTilingCacheRows; // number of rows in tilingCache array
- short numTilingCacheCols; // number of cols in tilingCache array
- FramePtr *tileFrameArray; // array of tile framePtrs
- short *curTileImage; // array specifying the current frame of each tile
- short maxNumTiles; // number of elements in tileFrameArray
- short tileWidth; // width of each tile
- short tileHeight; // height of each tile
- long numTilesChanged; // number of rects in changedTiles array to update
- Rect *changedTiles; // array of rects of tiles that changed
- long changedTilesArraySize; // number of elements in changedTiles array
- TileChangeProcPtr tileChangeProc; // pointer to tile frame changing procedure
- TileRectDrawProcPtr tileRectDrawProc; // pointer to the function that draws tiles in a rect
- DrawProcPtr tileMaskDrawProc; // drawProc for drawing masked tiles in tile layers
- DrawProcPtr partialMaskDrawProc; // drawProc for drawing partialMask tiles above sprites
-
- GDHandle mainSWGDH; // GDH of SpriteWorld's window
- short pixelDepth; // SpriteWorld's depth
-
- short fpsTimeInterval; // milliseconds per frame of animation (1000/fps)
- unsigned long runningTimeCount; // running total time in milliseconds
- UnsignedWide lastMicroseconds; // value of previous Microseconds() call
- unsigned long timeOfLastFrame; // time (from runningTimeCount) of last frame
- VBLTaskRec vblTaskRec; // extended VBLTask record
- Boolean usingVBL; // is the VBL task installed?
- Boolean frameHasOccurred; // Has the SpriteWorld been processed?
-
- short pad1; // (note: Boolean is the same as an unsigned char)
-
- long userData; // reserved for user
- };
-
-
- ///--------------------------------------------------------------------------------------
- // sprite world function prototypes
- ///--------------------------------------------------------------------------------------
-
-
- SW_FUNC OSErr SWEnterSpriteWorld(void);
-
- SW_FUNC void SWExitSpriteWorld(void);
-
- SW_FUNC OSErr SWCreateSpriteWorld(
- GDHandle mainGDH,
- SpriteWorldPtr *spriteWorldP,
- FramePtr windowFrameP,
- FramePtr backFrameP,
- FramePtr workFrameP,
- short maxDepth);
-
- SW_FUNC OSErr SWCreateSpriteWorldFromWindow(
- SpriteWorldPtr* spriteWorldP,
- CWindowPtr srcWindowP,
- Rect* worldRectP,
- Rect* offscreenRectP,
- short maxDepth);
-
- SW_FUNC void SWDisposeSpriteWorld(
- SpriteWorldPtr *spriteWorldPP);
-
- SW_FUNC void SWAddSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr spriteLayerP);
-
- SW_FUNC void SWRemoveSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr spriteLayerP);
-
- SW_FUNC void SWSwapSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr srcSpriteLayerP,
- SpriteLayerPtr dstSpriteLayerP);
-
- SW_FUNC SpriteLayerPtr SWGetNextSpriteLayer(
- SpriteWorldPtr spriteWorldP,
- SpriteLayerPtr curSpriteLayerP);
-
- SW_FUNC void SWLockSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWUnlockSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetPortToBackground(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetPortToWorkArea(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWSetPortToWindow(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC OSErr SWSetSpriteWorldOffscreenDrawProc(
- SpriteWorldPtr spriteWorldP,
- DrawProcPtr offscreenProc);
-
- SW_FUNC OSErr SWSetSpriteWorldScreenDrawProc(
- SpriteWorldPtr spriteWorldP,
- DrawProcPtr drawProc);
-
- SW_FUNC void SWSetPostEraseCallBack(
- SpriteWorldPtr spriteWorldP,
- CallBackPtr callBack);
-
- SW_FUNC void SWSetPostDrawCallBack(
- SpriteWorldPtr spriteWorldP,
- CallBackPtr callBack);
-
- SW_FUNC void SWStdWorldDrawProc(
- FramePtr srcFrameP,
- FramePtr dstFrameP,
- Rect* srcRect,
- Rect* dstRect);
-
- SW_FUNC void SWCopyBackgroundToWorkArea(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC OSErr SWChangeWorldRect(
- SpriteWorldPtr spriteWorldP,
- Rect* newWorldRect,
- Boolean changeOffscreenAreas);
-
- SW_FUNC void SWRestoreWorldRect(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWWindowMoved(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWWindowFrameMoved(
- FramePtr windowFrameP,
- Rect *frameRect);
-
- SW_FUNC void SWUpdateWindow(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWUpdateSpriteWorld(
- SpriteWorldPtr spriteWorldP,
- Boolean updateWindow);
-
- SW_FUNC void SWProcessSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWAnimateSpriteWorld(
- SpriteWorldPtr spriteWorldP);
-
- SW_FUNC void SWCheckIdleSpriteOverlap(
- SpriteWorldPtr spriteWorldP,
- register SpritePtr idleSpriteP,
- SpritePtr headActiveSpriteP);
-
- SW_FUNC void SWCheckIdleSpritesWithTiles(
- SpriteWorldPtr spriteWorldP,
- SpritePtr headIdleSpriteP);
-
- SW_FUNC void SWCheckIdleSpritesWithRects(
- SpriteWorldPtr spriteWorldP,
- SpritePtr headIdleSpriteP);
-
- SW_FUNC void SWFindSpritesToBeRemoved(
- SpriteWorldPtr spriteWorldP );
-
- SW_FUNC OSErr SWFlagRectAsChanged(
- SpriteWorldPtr spriteWorldP,
- Rect* theChangedRect);
-
- SW_FUNC OSErr SWFlagScrollingRectAsChanged(
- SpriteWorldPtr spriteWorldP,
- Rect* theChangedRect);
-
- SW_FUNC void SWSetSpriteWorldMaxFPS(
- SpriteWorldPtr spriteWorldP,
- short framesPerSec);
-
- SW_FUNC OSErr SWSyncSpriteWorldToVBL(
- SpriteWorldPtr spriteWorldP,
- Boolean syncingOn);
-
- void SWSetCleanUpSpriteWorld(SpriteWorldPtr spriteWorldP);
-
- SW_FUNC unsigned long SWGetSpriteWorldVersion( void );
-
-
- #if GENERATINGCFM
- void SWVBLTask(VBLTaskRecPtr vblTaskPtr);/* Under CFM, we're passed the VBL task pointer */
- #else
- void SWVBLTask(void); /* Otherwise, we'll have to get it out of register A0 */
- #endif
-
-
- #if PRAGMA_ALIGN_SUPPORTED
- #pragma options align=reset
- #endif
-
- #ifdef __cplusplus
- }
- #endif
-
- #endif /* __SPRITEWORLD__ */